package com.xuecheng.content.controller;

import com.xuecheng.api.content.FileManagerApi;
import com.xuecheng.api.content.model.UploadTokenResult;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.content.common.constant.ContentErrorCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * <h4>xuecheng</h4>
 * <p>获取文件上传凭证</p>
 *
 * @author : by wujianming
 * @date : 2021-12-13 15:12
 **/
@RestController
@RequestMapping("/common")
public class FileManagerController implements FileManagerApi {


    @Autowired
    private RestTemplate restTemplate;

    //远程地址
    @Value("${file.service.url}")
    private String url;
    //七牛云中空间地址
    @Value("${file.service.bucket}")
    private String bucket;
    //文件存储区域地址
    @Value("${file.service.upload.region}")
    private String region;
    //七牛云cdn加速域名
    @Value("${cdn.domain}")
    private String domain;
    //
    @Value("${file.token.type}")
    private String type;
    @Value("${file.token.deadline}")
    private int deadline;


    //获取上传文件七牛云凭证

    /**
     * @return com.xuecheng.api.content.model.UploadTokenResult
     * Nacos中配置核心数据-->注入问服务-->添加核心数据并发送远程请求-->获取相关数据-->封装返回
     * @Description //
     * @Date 2021/12/13 15:14
     * @Param []
     **/
    @Override
    @GetMapping("/qnUploadToken")
    public UploadTokenResult qiniuUploadToken() {
        //设置发送到远程文件系统所需要的值
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("tokenType", type);
        hashMap.put("scope", bucket);
        hashMap.put("deadline", deadline);
        //上传文件的key值-->指定上传到七牛云后的文件名
        String s = String.valueOf(System.currentTimeMillis());
        hashMap.put("key",s);
        //开始发送远程连接-->postForEntity方法可获得状态码.响应头.响应数据
       ResponseEntity<Map> response = restTemplate.postForEntity(url, hashMap, Map.class);
        //获取响应状态码
        int codeValue = response.getStatusCodeValue();
        //如果不是200成功抛异常
        if (HttpStatus.OK.value()!=codeValue){
            ExceptionCast.cast(ContentErrorCode.E_120037);
        }
        //获取响应结果集
        Map body = response.getBody();

        // 2.将结果封装成前端所需要的内容
        UploadTokenResult tokenResult = new UploadTokenResult();

        tokenResult.setTokenType(type);
        tokenResult.setScope(bucket);
        tokenResult.setKey(s);
        //凭证内容
        tokenResult.setQnToken(body.get("result").toString());
        tokenResult.setUp_region(region);
        tokenResult.setDomain(domain);
        tokenResult.setDeadline(deadline);
        //返回上传相关凭证
        return tokenResult;
    }
}
